//
// Created by LiuYou on 2021/10/12.
//

#ifndef LINUXMULTITHREADSERVERPROGRAMMING_COUNTER_HPP
#define LINUXMULTITHREADSERVERPROGRAMMING_COUNTER_HPP

/*
 * 这里为了一目了然, 没有将声明和定义分离。所以导入的头文件全部放在了头文件中。
 */
#include <iostream>
#include "util/MutexLock.hpp"


/**
 * @brief 一个线程安全的 class 例子。
 * @details 使用同步原语保护其内部状态即可。
 */
class Counter {
public:
    int64_t getAndIncrease() {
        MutexLockGuard mutexLockGuard( mutexLock );
        return ++value;
    }

public:
    int64_t getValue() const {
        MutexLockGuard mutexLockGuard( mutexLock );
        return value;
    }

public:
    explicit Counter(int64_t value = 0) : value( value ) {
        std::cout << "这个对象在线程[ " << pthread_self() << " ]中创建出来了。" << std::endl;
    }

    ~Counter() {
        std::cout << "这个对象在线程[ " << pthread_self() << " ]中释放了。" << std::endl;
    }

private:
    int64_t value;
    /**
     * 字段: mutexLock, 是 mutable的, 所以 const成员方法可能直接使用 这个字段。
     */
    mutable MutexLock mutexLock;

    friend std::ostream& operator<<(std::ostream& os, const Counter& counter) {
        os << "value: " << counter.value;
        return os;
    }
};


#endif //LINUXMULTITHREADSERVERPROGRAMMING_COUNTER_HPP
